package cn.lingyangwl.agile.system.model.rqrs.menu;

import cn.lingyangwl.agile.system.model.entity.SysMenu;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

/**
 * 路由配置信息
 * 
 * @author shenguangyang
 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Getter
@Setter
public class VueRouterResp {
    private Long id;
    /**
     * 路由名字
     */
    private String name;

    /**
     * 菜单标识, 用于一些业务场景处理
     */
    private String code;

    /**
     * 路由地址
     */
    private String path;

    /**
     * 是否隐藏路由，当设置 true 的时候该路由不会再侧边栏出现
     */
    private boolean hideMenu;

    /**
     * 是否隐藏tab
     */
    private boolean hideTab;

    /**
     * 重定向地址，当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
     */
    private String redirect;

    /**
     * 组件地址
     */
    private String component;

    /**
     * 是否为聚合路由 (聚合路由的情况下允许使用子菜单路径作为父菜单的路由地址)
     */
    private Boolean alwaysShow;

    /**
     * 其他元素
     */
    private Meta meta;

    /**
     * 是否路由菜单: 0:不是  1:是（默认值1）
     */
    private Boolean route;

    /**
     * 子路由
     */
    private List<VueRouterResp> children = new ArrayList<>();


    /**
     * 路由显示信息
     *
     * @author shenguangyang
     */
    @Getter
    @Setter
    @ToString
    public static class Meta {
        /**
         * 设置该路由在侧边栏和面包屑中展示的名字
         */
        private String title;

        /**
         * 设置该路由的图标，对应路径src/assets/icons/svg
         */
        private String icon;

        /**
         * 设置为true，则不会被 <keep-alive>缓存
         */
        private boolean keepAlive;

        /**
         * 是否隐藏菜单
         */
        private boolean hideMenu;

        /**
         * 是否隐藏tab
         */
        private boolean hideTab;

        /**
         * 是否为外链
         */
        private boolean external;

        /**
         * 是否在主框架外打开
         */
        private Boolean isMainOut;

        /**
         * 当前激活的菜单, 只有是隐藏菜单时才会有值, 默认取第一个非隐藏菜单的父级菜单路径
         */
        private String currentActiveMenu;

        public Meta(SysMenu menu) {
            this.title = menu.getName();
            this.icon = menu.getIcon();
            this.keepAlive = menu.getIsCache();
            this.hideMenu = menu.getHideMenu();
            this.hideTab = menu.getHideTab();
            this.external = menu.getExternal();
            this.isMainOut = menu.getIsMainOut();
        }
    }

    public Meta genMata(SysMenu menu) {
        this.meta = new Meta(menu);
        return this.meta;
    }
}
